package net.ksic.uridongne;

import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapActivity extends FragmentActivity implements LocationListener,
		OnClickListener {

	/** 구글맵(2) - 객체선언 */
	GoogleMap googleMap = null;
	/** 구글맵(5) - 내 위치를 표시할 마커 */
	Marker myMarker = null;
	// (1) 위치 관리자 객체 선언
	LocationManager lm = null;

	Button home = null, takepic = null, album = null, clist = null, group = null;

	double locgpslati = 0.0;
	double locgpslong = 0.0;
	String locaddr1 = null;
	String locaddr2 = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_map);
		
		/** 구글맵(3) - 객체 할당 */
		SupportMapFragment smf = (SupportMapFragment) getSupportFragmentManager()
				.findFragmentById(R.id.map);
		googleMap = smf.getMap();

		// (2) 위치 관리자 객체 할당( 아직 GPS 구동은 아님)
		lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

		setButton();
	}

	public void setButton() {
		home = (Button) findViewById(R.id.home);
		takepic = (Button) findViewById(R.id.takepic);
		album = (Button) findViewById(R.id.album);
		clist = (Button) findViewById(R.id.clist);
		group = (Button) findViewById(R.id.group);

		home.setOnClickListener(this);
		takepic.setOnClickListener(this);
		album.setOnClickListener(this);
		clist.setOnClickListener(this);
		group.setOnClickListener(this);
	}

	/**
	 * 화면이 보이기 시작하는 시점에 자동으로 호출되는 LifeCycle Method --> GPS 구동, List용 XML 호출
	 */
	@Override
	public void onResume() {
		super.onResume();

		/** (3) 사용 가능한 최적의 위치관련 장치 이름 검색 */
		String provider = null;
		Criteria cri = new Criteria();
		provider = lm.getBestProvider(cri, true);
		
		// 검색된 이름이 없거나, 장치가 꺼져 있는 경우
		if (provider == null || !lm.isProviderEnabled(provider)) {
			// 전체 장치 이름 목록
			List<String> list = lm.getAllProviders();

			for (int i = 0; i < list.size(); i++) {
				String tmp = list.get(i);
				if (lm.isProviderEnabled(tmp)) {
					provider = tmp;
					break;
				}
			}
		}
		if (provider == null) {
			Toast.makeText(this, "사용가능한 위치 관련 장치가 없습니다.", Toast.LENGTH_SHORT)
					.show();
			return;
		}

		/** (4) 위치정보 장치 구동 시작 */
		// 미지막으로 구동되었던 곳의 위치 얻기
		Location loc = lm.getLastKnownLocation(provider);

		// 미지막 위치가 저장되어 있다면, 이어서 시작하기.
		if (loc != null) {
			onLocationChanged(loc);
		}

		// 위치 정보 구동시작
		// 1) 장치 이름
		// 2) 재 실행 주기 (시간, 1/1000 초)
		// 3) 재 실행 주기 (거리, 미터)
		// 4) 재 실행 주기에 따라서 호출될 이벤트 핸들러
		lm.requestLocationUpdates(provider, 60000, 500, this);
	}

	/**
	 * 화면이 가려지기 시작하는 시점에 자동으로 호출되는 LifeCycle Methode --> GPS 중지
	 */
	@Override
	public void onPause() {
		super.onPause();
		// GPS 끄기~!!
		lm.removeUpdates(this);
	}

	/** (5) 위치 정보가 전달되는 이벤트에서 기능 구현 */
	@Override
	public void onLocationChanged(Location location) {
		// 위도
		locgpslati = location.getLatitude();
		// 경도
		locgpslong = location.getLongitude();		

		/** 구글맵(4) - 지도의 카메라를 현재 위치로 이동 */
		LatLng latLng = new LatLng(locgpslati, locgpslong);
		// zoo, 설정 1~21Rkwl > 값이 클수록 확대
		CameraUpdate camera = CameraUpdateFactory.newLatLngZoom(latLng, 18.5f);
		googleMap.animateCamera(camera);

		/** 구글맵(6) - 마커 생성 */
		LatLng position = new LatLng(locgpslati, locgpslong);

		if (myMarker == null) {
			MarkerOptions op = new MarkerOptions();
			op.position(position);
			//op.title(address);
			op.icon(BitmapDescriptorFactory.fromResource(R.drawable.location));
			myMarker = googleMap.addMarker(op);
		} else {
			myMarker.setPosition(position);
		}
	}

	@Override
	public void onProviderDisabled(String provider) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onProviderEnabled(String provider) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {
		// TODO Auto-generated method stub

	}

	/** 위도와 경도 기반으로 주소를 리턴하는 메서드 */
	public void getAddress(double lat, double lng) {
		// 위치정보를 활용하기 위한 구글 API 객체
		Geocoder geocoder = new Geocoder(this, Locale.getDefault());

		// 주소 목록을 담기 위한 HashMap
		List<Address> list = null;

		try {
			list = geocoder.getFromLocation(lat, lng, 1);
		} catch (Exception e) {
			e.printStackTrace();
		}

		if (list == null) {
			Log.e("getAddress", "주소 데이터 얻기 실패");
			locaddr1 = "?";
			locaddr2 = "?";
		}

		if (list.size() > 0) {
			Address addr = list.get(0);
			//address = addr.getCountryName() + " " + addr.getLocality() + " "
			//		+ addr.getThoroughfare() + " " + addr.getFeatureName();
			locaddr1 = addr.getCountryName() + " " + addr.getLocality() + " " + addr.getThoroughfare();
			locaddr2 = addr.getFeatureName();
		}
	}

	@Override
	public void onClick(View v) {
		String sendMsg = "";

		Intent intent = null;

		switch (v.getId()) {
		case R.id.home:
			sendMsg = "map";
			Toast.makeText(this, "첫화면", Toast.LENGTH_SHORT).show();
			intent = new Intent(this, MapActivity.class);
			break;
		case R.id.takepic:
			sendMsg = "camera";
			Toast.makeText(this, "카메라", Toast.LENGTH_SHORT).show();
			intent = new Intent(this, PicActivity.class);
			break;
		case R.id.album:
			sendMsg = "album";
			Toast.makeText(this, "앨범", Toast.LENGTH_SHORT).show();
			intent = new Intent(this, PicActivity.class);
			break;
		case R.id.clist:
			sendMsg = "clist";
			Toast.makeText(this, "컨텐츠", Toast.LENGTH_SHORT).show();
			intent = new Intent(this, ContentsActivity.class);
			break;
		case R.id.group:
			sendMsg = "group";
			Toast.makeText(this, "커뮤니티", Toast.LENGTH_SHORT).show();
			intent = new Intent(this, GroupActivity.class);
			break;
		}
		// 주소 얻기
		getAddress(locgpslati, locgpslong);			

		intent.putExtra("SEND_MESSAGE", sendMsg);
		intent.putExtra("locaddr1", locaddr1);
		intent.putExtra("locaddr2", locaddr2);
		intent.putExtra("locgpslati", locgpslati+"");
		intent.putExtra("locgpslong", locgpslong+"");

		startActivity(intent);
	}	
}
